/**
* \file		EvenementAleatoire.h
* \brief	Définit la structure EvenementAleatoire
* \details	C'est ici que sont définis la structure EvenementAleatoire, ses
*		accesseurs, ses mutateurs. 
*/

#ifndef EVENEMENTALEATOIRE_H
#define EVENEMENTALEATOIRE_H


/**
* \brief	Ethnie concernée par l'évènement
* \details	Type énuméré : ethnie concernée par l'évènement, si NULL,
*		aucune ethnie n'est concernée
*/

typedef enum
{
   clanPillard,
   clanMarchand,
   elfes,
   NULL
}enumEthniesEven;


/**
* \brief	Lien concerné par l'évènement
* \details	Type énuméré : lien concerné par l'évènement, si NULL,
*		aucun lien n'est modifié
*/
typedef enum
{
   commerce,
   menaceMilit,
   empathie,
   NULL
}enumLiensEven;

/**
* \brief	Choix du joueur
* \details	Choix fait par le joueur pour la résolution de l'énèvement
*/

typedef enum
{
   1,
   2,
   3,
   4
}choixJoueurEven;


/**
* \brief	Informations définissant les événements aléatoires
* \details	Dans cette structure sont stockées toutes les informations
*		relatives aux grands événements survenant au cours de la partie
*		et impactant plus ou moins la colonie.
*/
typedef struct
{
   char ID[15];			/*!<identifiant de l'évènement : chaîne de
				caractères */
   char titre[50];		/*!<titre : chaîne de caractères */
   char description[200];	/*!<description : chaîne de caractères*/
   unsigned int probabilite;	/*!<probabilité que l'évènement survienne : 					entier non signé */
   int ville[6];		/*!<impact sur la ville, tableau d'entiers :
				case 0 : impact sur la défense
				case 1 : impact sur l'attaque
				case 2 : impact sur l'émigration
				case 3 : impact sur l'immigration
				case 4 : impact sur la natalité
				case 5 : impact sur la mortalité*/
   int entrepot[5];		/*!<impact sur les réserves : tableau d'entiers
				case 0 : impact sur le bois
				case 1 : impact sur le métal
				case 2 : impact sur le houblon
				case 3 : impact sur la nourriture
				case 4 : impact sur la bière*/
   enumEthniesEven impactDiplEthnie;	/*!<ethnie impactée*/
   enumLiensEven impactDilpLien;	/*!<lien impacté*/
   int impactDiplAmplitude;	/*<valeur de l'impact sur le lien : entier*/
   choixJoueurEven choix;	/*<choix fait par le joueur*/
   char descrChoixEven[4][100];	/*!<description du choix n° 1, 2, 3, 4 ; 99 					caractères maximum*/
}

/*================================Fonctions=================================*/

/**
* \brief	Initialise un événement aléatoire avec des valeurs données.
* \details	Initialise tous les éléments d'un EvenementAleatoire à des
*		valeurs données.
* \param	peven		Un pointeur sur EvenementAleatoire
* \param	ID		identifiant : chaîne de caractères (max : 14)
* \param	titre		Nom de l'évènement tel qu'il sera présenté au 					joueur : chaîne de caractères (max : 49)
* \param	description	Description de l'évènement tel qu'elle sera
				présentée au joueur : chaîne de caractères
				(max : 199 caractères)
* \param	probabilite	Score permettant de calculer la probabilité que
				cet évènement survienne : entier non signé
* \param	ville		Tableau d'entiers contenant les valeurs de
				l'impact de l'évènement sur la ville. Les cases
				correspondent aux caractères suivants :
				case 0 : impact sur la défense, 
				case 1 : impact sur l'attaque, 
				case 2 : impact sur l'émigration, 
				case 3 : impact sur l'immigration, 
				case 4 : impact sur la natalité, 
				case 5 : impact sur la mortalité
* \param	entrepot	Tableau contenant les valeurs de l'impact de
				l'évènement sur les stocks de la ville. Les
				cases correspondent aux stocks suivants :
				case 0 : impact sur le bois, 
				case 1 : impact sur le métal, 
				case 2 : impact sur le houblon, 
				case 3 : impact sur la nourriture, 
				case 4 : impact sur la bière
* \param	impactDiplEthnie	Sur quelle ethnie il y a impact, si la
					diplomatie est affectée par cet
					évènement, type énuméré parmi
					clanPillard, clanMarchand, elfes, NULL
* \param	impactDiplLien		Sur quel lien il y a impact, si la
					diplomatie est affectée par cet
					évènement, type énuméré parmi
					commerce, menaceMilit, empathie, NULL
* \param	impactDiplAMplitude	Quelle est l'ampleur de l'impact de
					l'évènement sur le lien diplomatique
					entre le joueur et l'ethnie ? entier
* \param	choixJoueurEven		Le choix pour lequel le joueur a opté.
					Type énuméré parmi 1, 2, 3, 4
* \param	descrChoixEven		La description des choix possibles pour
					le joueur (tableau de caractères : 4
					cases (car 4 choix), 99 caractères
					maximum)
*/
void initEvenAlea(EvenementAleatoire *peven,
   char ID[15];
   char titre[50];
   char description[200];
   unsigned int probabilite,
   int ville[6],
   int entrepot[5],
   enumEthniesEven impactDiplEthnie,
   enumLiensEven impactDilpLien,
   int impactDiplAmplitude,
   choixJoueurEven choix,
   char descrChoixEven[4][100]);

/**
* \brief	Initialise un événement aléatoire à zéro (ou NULL, suivant le
*		champ)
* \param	peven		Un pointeur sur EvenementAleatoire
*/
void creerEvenAlea(EvenementAleatoire *peven);

/**
* \brief	Renvoie l'ID d'un évènement donné
* \param	even		Un EvenementAleatoire
*/
char* getIDEvenAlea(EvenementAleatoire even);

/**
* \brief	Renvoie le titre d'un évènement donné
* \param	even		Un EvenementAleatoire
*/
char* getTitreEvenAlea(EvenementAleatoire even);

/**
* \brief	Renvoie la description d'un évènement donné
* \param	even		Un EvenementAleatoire
*/
char* getDescrEvenAlea(EvenementAleatoire even);

/**
* \brief	Renvoie l'impact d'un évènement donné sur la défense de la ville
* \param	even		Un EvenementAleatoire
*/
int getImpactDefenseEvenAlea(EvenementAleatoire even);

/**
* \brief	Renvoie l'impact d'un évènement donné sur l'attaque de la ville
* \param	even		Un EvenementAleatoire
*/
int getImpactAttaqueEvenAlea(EvenementAleatoire even);

/**
* \brief	Renvoie l'impact d'un évènement donné sur l'émigration
* \param	even		Un EvenementAleatoire
*/
int getImpactEmigrationEvenAlea(EvenementAleatoire even);

/**
* \brief	Renvoie l'impact d'un évènement donné sur l'immigration
* \param	even		Un EvenementAleatoire
*/
int getImpactImmigrationEvenAlea(EvenementAleatoire even);

/**
* \brief	Renvoie l'impact d'un évènement donné sur la natalité
* \param	even		Un EvenementAleatoire
*/
int getImpactNatalitéEvenAlea(EvenementAleatoire even);

/**
* \brief	Renvoie l'impact d'un évènement donné sur la mortalité
* \param	even		Un EvenementAleatoire
*/
int getImpactMortaliteEvenAlea(EvenementAleatoire even);

/**
* \brief	Renvoie l'impact d'un évènement donné sur le stock de bois
* \param	even		Un EvenementAleatoire
*/
int getImpactBoisEvenAlea(EvenementAleatoire even);

/**
* \brief	Renvoie l'impact d'un évènement donné sur le stock de metal
* \param	even		Un EvenementAleatoire
*/
int getImpactMetalEvenAlea(EvenementAleatoire even);

/**
* \brief	Renvoie l'impact d'un évènement donné sur le stock de houblon
* \param	even		Un EvenementAleatoire
*/
int getImpactHoublonEvenAlea(EvenementAleatoire even);

/**
* \brief	Renvoie l'impact d'un évènement donné sur le stock de nourriture
* \param	even		Un EvenementAleatoire
*/
int getImpactNourritureEvenAlea(EvenementAleatoire even);

/**
* \brief	Renvoie l'ethnie concernée par l'évènement
* \param	even		Un EvenementAleatoire
*/
enumEthniesEven getImpactDiplEthniesEvenAlea(EvenementAleatoire even);

/**
* \brief	Renvoie le lien diplomatique modifié par l'évènement
* \param	even		Un EvenementAleatoire
*/
enumLiensEven getImpactDiplLiensEvenAlea(EvenementAleatoire even);

/**
* \brief	Renvoie l'amplitude de l'impact de l'évènement sur le lien
*		diplomatique. Si aucun, 0.
* \param	even		Un EvenementAleatoire
*/
int getImpactDiplAmplitudeEvenAlea(EvenementAleatoire even);

/**
* \brief	Renvoie le score permettant de calculer la probabilité que
*		l'évènement survienne
* \param	even		Un EvenementAleatoire
*/
unsigned int getProbabiliteEvenAlea(EvenementAleatoire even);

/**
* \brief	Affecte à ID une chaîne de caractères donnée
* \param	peven		Un pointeur sur EvenementAleatoire
* \param	ID		Une chaîne de caractères
*/
void setIDEvenAlea(EvenementAleatoire *peven, char *ID);

/**
* \brief	Affecte à titre une chaîne de caractères donnée
* \param	peven		Un pointeur sur EvenementAleatoire
* \param	titre		Une chaîne de caractères
*/
void setTitreEvenAlea(EvenementAleatoire *peven, char titre);

/**
* \brief	Affecte à description une chaîne de caractères donnée
* \param	peven		Un pointeur sur EvenementAleatoire
* \param	descr		Une chaîne de caractères
*/
void setDescrEvenAlea(EvenementAleatoire *peven, char *descr);

/**
* \brief	Affecte un entier donné à la valeur d'impact sur la défense de
*		l'évènement
* \param	peven		Un pointeur sur EvenementAleatoire
* \param	impDef		Un entier
*/
void setImpactDefenseEvenAlea(EvenementAleatoire *peven, int impDef);

/**
* \brief	Affecte un entier donné à la valeur d'impact sur l'attaque de
*		l'évènement
* \param	peven		Un pointeur sur EvenementAleatoire
* \param	impAtt		Un entier
*/
void setImpactAttaqueEvenAlea(EvenementAleatoire *peven, int impAtt);

/**
* \brief	Affecte un entier donné à la valeur d'impact de l'évènement sur
*		l'émigration
* \param	peven		Un pointeur sur EvenementAleatoire
* \param	impEmigr	Un entier
*/
void setImpactEmigrationEvenAlea(EvenementAleatoire *peven, int impEmigr);

/**
* \brief	Affecte un entier donné à la valeur d'impact de l'évènement sur
*		l'immigration
* \param	peven		Un pointeur sur EvenementAleatoire
* \param	impImmigr	Un entier
*/
void setImpactImmigrationEvenAlea(EvenementAleatoire *peven, int impImmigr);

/**
* \brief	Affecte un entier donné à la valeur d'impact de l'évènement sur
*		la natalité
* \param	peven		Un pointeur sur EvenementAleatoire
* \param	impNat	Un entier
*/
void setImpactNatalitéEvenAlea(EvenementAleatoire *peven, int impNat);

/**
* \brief	Affecte un entier donné à la valeur d'impact de l'évènement sur
*		la mortalité
* \param	peven		Un pointeur sur EvenementAleatoire
* \param	impMort		Un entier
*/
void setImpactMortaliteEvenAlea(EvenementAleatoire *peven, int impMort);

/**
* \brief	Affecte un entier donné à la valeur d'impact de l'évènement sur
*		le stock de bois
* \param	peven		Un pointeur sur EvenementAleatoire
* \param	impBois		Un entier
*/
void setImpactBoisEvenAlea(EvenementAleatoire *peven, int impBois);

/**
* \brief	Affecte un entier donné à la valeur d'impact de l'évènement sur
*		le stock de metal
* \param	peven		Un pointeur sur EvenementAleatoire
* \param	impMetal		Un entier
*/
void setImpactMetalEvenAlea(EvenementAleatoire *peven, int impMetal);
/***********************************************************************************************************************************************************/
/**
* \brief	Renvoie l'impact d'un évènement donné sur le stock de houblon
* \param	peven		Un pointeur sur EvenementAleatoire
*/
int getImpactHoublonEvenAlea(EvenementAleatoire peven);

/**
* \brief	Renvoie l'impact d'un évènement donné sur le stock de nourriture
* \param	peven		Un pointeur sur EvenementAleatoire
*/
int getImpactNourritureEvenAlea(EvenementAleatoire peven);

/**
* \brief	Renvoie l'ethnie concernée par l'évènement
* \param	peven		Un pointeur sur EvenementAleatoire
*/
enumEthniesEven getImpactDiplEthniesEvenAlea(EvenementAleatoire peven);

/**
* \brief	Renvoie le lien diplomatique modifié par l'évènement
* \param	peven		Un pointeur sur EvenementAleatoire
*/
enumLiensEven getImpactDiplLiensEvenAlea(EvenementAleatoire peven);

/**
* \brief	Renvoie l'amplitude de l'impact de l'évènement sur le lien
*		diplomatique. Si aucun, 0.
* \param	peven		Un pointeur sur EvenementAleatoire
*/
int getImpactDiplAmplitudeEvenAlea(EvenementAleatoire peven);

/**
* \brief	Renvoie le score permettant de calculer la probabilité que
*		l'évènement survienne
* \param	peven		Un pointeur sur EvenementAleatoire
*/
unsigned int getProbabiliteEvenAlea(EvenementAleatoire peven);


#endif
